using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI.WebControls;
using objetos;
using dados;
using publico;
using System.IO;
using System.Xml.Serialization;

namespace negocios
{
	#region TB_NF_ITEM
	/// <summary>
	/// This object represents the properties and methods of a TB_NF_ITEM.
	/// </summary>
	public class BLL_TB_NF_ITEM : System.Web.UI.Page
	{		
		DAL_TB_NF_ITEM DAL = new DAL_TB_NF_ITEM();
		
		#region METODOS PROCEDURES



        public DataTable Dt_nf_item
        {
            get
            {
                if (Session["dt_nf_item"] == null)
                {
                    Dt_nf_item = CriarDataTable();
                }
                return (DataTable)Session["dt_nf_item"];
            }
            set { Session["dt_nf_item"] = value; }
        }



		/// <summary>
		/// Incluir via procedure
		/// </summary>
        public int Incluir(OBJ_TB_NF_ITEM obj)
        {

            return DAL.Incluir(obj);

            //int id_tipo_movimento = 0;
            //int id_estoque_movimento = 0;
            //int id_nf_item = 0;


            //try
            //{
            //    // NF
            //    OBJ_TB_NF o_tb_nf = new OBJ_TB_NF();
            //    BLL_TB_NF b_tb_nf = new BLL_TB_NF();

            //    // ESTOQUE MOVIMENTO
            //    BLL_TB_ESTOQUE_MOVIMENTO b_tb_estoque_movimento = new BLL_TB_ESTOQUE_MOVIMENTO();
            //    OBJ_TB_ESTOQUE_MOVIMENTO o_tb_estoque_movimento = new OBJ_TB_ESTOQUE_MOVIMENTO();

            //    // ESTOQUE NOTA FISCAL
            //    OBJ_TB_ESTOQUE_NOTA_FISCAL o_tb_estoque_nota_fiscal = new OBJ_TB_ESTOQUE_NOTA_FISCAL();
            //    BLL_TB_ESTOQUE_NOTA_FISCAL b_tb_estoque_nota_fiscal = new BLL_TB_ESTOQUE_NOTA_FISCAL();

            //    BLL_TB_TIPO_ITEM b_tb_tipo_item = new BLL_TB_TIPO_ITEM();
            //    OBJ_TB_TIPO_ITEM o_tb_tipo_item = new OBJ_TB_TIPO_ITEM();

            //    // TIPO MOVIMENTO 
            //    BLL_TB_ESTOQUE_TIPO_MOVIMENTO b_tb_estoque_tipo_movimento = new BLL_TB_ESTOQUE_TIPO_MOVIMENTO();
            //    OBJ_TB_ESTOQUE_TIPO_MOVIMENTO o_tb_estoque_tipo_movimento = new OBJ_TB_ESTOQUE_TIPO_MOVIMENTO();            

            //    o_tb_nf = b_tb_nf.SelecionarObjetoPorId(obj.id_nf);

            //    List<OBJ_TB_TIPO_ITEM> lista_tipo_item = b_tb_tipo_item.SelecionarLista();

            //    List<OBJ_TB_ESTOQUE_TIPO_MOVIMENTO> lista_tipo_movimento = b_tb_estoque_tipo_movimento.SelecionarLista();
               

            //    if (o_tb_nf.id_operacao == (int)PUB_ENUM.NF_OPERACAO.SAIDA)
            //    {
            //        id_tipo_movimento = (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.SAIDA;
            //        o_tb_estoque_movimento.valor_compra = 0;
            //        o_tb_estoque_movimento.valor_venda = obj.valor_total;
            //        o_tb_estoque_movimento.qtd_entrada = 0;
            //        o_tb_estoque_movimento.qtd_saida = obj.qtd;
            //    }
            //    else
            //    {
            //        id_tipo_movimento = (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.ENTRADA;
            //        o_tb_estoque_movimento.valor_compra = obj.valor_total;
            //        o_tb_estoque_movimento.valor_venda = 0;
            //        o_tb_estoque_movimento.qtd_entrada = obj.qtd;
            //        o_tb_estoque_movimento.qtd_saida = 0;

            //    }

            //    id_nf_item = DAL.Incluir(obj);

            //    // SE FOR DIFERENTE DE SERVICO MOVIMENTA ESTOQUE
            //    if (obj.id_tipo_item != (int)PUB_ENUM.TIPO_ITEM.Servicos)
            //    {

                   

            //        o_tb_estoque_movimento.dt_atualizacao = DateTime.Now;
            //        o_tb_estoque_movimento.id_empresa = o_tb_nf.id_empresa;
            //        o_tb_estoque_movimento.tipo_documento = "NF";
            //        o_tb_estoque_movimento.num_documento = o_tb_nf.num_nota_fiscal.ToString();                    
            //        o_tb_estoque_movimento.id_produto = obj.id_produto_servico;
            //        o_tb_estoque_movimento.id_tipo_movimento = id_tipo_movimento;
            //        o_tb_estoque_movimento.id_usuario = PUB_SESSAO.Id;
                   
            //        o_tb_estoque_movimento.sigla_movimento = lista_tipo_movimento.Find((tipo) => tipo.id == id_tipo_movimento).sigla.ToString();                 
            //        id_estoque_movimento = b_tb_estoque_movimento.Incluir(o_tb_estoque_movimento);


            //        o_tb_estoque_nota_fiscal.id_estoque_movimento = id_estoque_movimento;
            //        o_tb_estoque_nota_fiscal.id_nf_item = obj.id;
            //        o_tb_estoque_nota_fiscal.id_nf = obj.id_nf;
            //        b_tb_estoque_nota_fiscal.Incluir(o_tb_estoque_nota_fiscal);

            //    }
               
            //    return id_nf_item;


            //}
            //catch (Exception)
            //{

            //    throw;
            //}



        }

        public void AtualizaTotalNotaFiscal(int id_nf,int id_operacao)
        {
            DAL.AtualizaTotalNotaFiscal(id_nf,id_operacao);
        }
		
		/// <summary>
		/// Alterar via procedure
		/// </summary>
		public void Alterar(OBJ_TB_NF_ITEM obj)
		{
			DAL.Alterar(obj);	
		}

        /// <summary>
        /// Excluir via procedure
        /// </summary>
        public void Excluir(OBJ_TB_NF_ITEM obj)
        {
            try
            {
                int id_tipo_movimento = 0;
                int id_estoque_movimento = 0;

                // NF 
                OBJ_TB_NF o_tb_nf = new OBJ_TB_NF();
                BLL_TB_NF b_tb_nf = new BLL_TB_NF();


                // ESTOQUE MOVIMENTO
                BLL_TB_ESTOQUE_MOVIMENTO b_tb_estoque_movimento = new BLL_TB_ESTOQUE_MOVIMENTO();
                OBJ_TB_ESTOQUE_MOVIMENTO o_tb_estoque_movimento = new OBJ_TB_ESTOQUE_MOVIMENTO();

                // TIPO MOVIMENTO 
                BLL_TB_ESTOQUE_TIPO_MOVIMENTO b_tb_estoque_tipo_movimento = new BLL_TB_ESTOQUE_TIPO_MOVIMENTO();
                OBJ_TB_ESTOQUE_TIPO_MOVIMENTO o_tb_estoque_tipo_movimento = new OBJ_TB_ESTOQUE_TIPO_MOVIMENTO();

                // ESTOQUE NOTA FISCAL
                BLL_TB_ESTOQUE_NOTA_FISCAL b_tb_estoque_nota_fiscal = new BLL_TB_ESTOQUE_NOTA_FISCAL();
                OBJ_TB_ESTOQUE_NOTA_FISCAL o_tb_estoque_nota_fiscal = new OBJ_TB_ESTOQUE_NOTA_FISCAL();

                o_tb_nf = b_tb_nf.SelecionarObjetoPorId(obj.id_nf);


                List<OBJ_TB_ESTOQUE_TIPO_MOVIMENTO> lista_tipo_movimento = b_tb_estoque_tipo_movimento.SelecionarLista();

                id_tipo_movimento = (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.ENTRADA;


                // EXCLUIR O ITEM
                DAL.Excluir(obj);

                o_tb_estoque_movimento = new OBJ_TB_ESTOQUE_MOVIMENTO();

                o_tb_estoque_movimento.dt_atualizacao = DateTime.Now;
                o_tb_estoque_movimento.id_empresa = o_tb_nf.id_empresa;
                o_tb_estoque_movimento.id_produto = obj.id_produto_servico;
                o_tb_estoque_movimento.id_tipo_movimento = id_tipo_movimento;
                o_tb_estoque_movimento.id_usuario = PUB_SESSAO.Id;
                o_tb_estoque_movimento.qtd_entrada = obj.qtd;
                o_tb_estoque_movimento.qtd_saida = 0;
                o_tb_estoque_movimento.sigla_movimento = lista_tipo_movimento.Find((tipo) => tipo.id == id_tipo_movimento).sigla.ToString();
                o_tb_estoque_movimento.valor_compra = obj.valor_total;
                o_tb_estoque_movimento.valor_venda = 0;
                id_estoque_movimento = b_tb_estoque_movimento.Incluir(o_tb_estoque_movimento);

                // nota fiscal
                
                o_tb_estoque_nota_fiscal.id_nf_item = obj.id;
                o_tb_estoque_nota_fiscal.id_estoque_movimento = id_estoque_movimento;
                o_tb_estoque_nota_fiscal.id_nf = obj.id_nf;
                b_tb_estoque_nota_fiscal.Incluir(o_tb_estoque_nota_fiscal);


            }
            catch (Exception)
            {

                throw;
            }


        }
		
		/// <summary>
		/// Excluir Lista via procedure
		/// </summary>
		public void ExcluirLista(List<OBJ_TB_NF_ITEM> lista)
		{
				foreach (OBJ_TB_NF_ITEM obj in lista)
            	{
                this.Excluir(obj);
            	}
			
		}
						
		/// <summary>
		/// Pesquisar Parametros Where, OrderBy, PageIndex, PageSize
		/// </summary>		
		public DataSet Selecionar(string Where, string OrderBy, int PageIndex, int PageSize)
		{
			
			return DAL.Selecionar(Where,OrderBy,PageIndex,PageSize);
			
		}		
		
		
		/// <summary>
		/// Retorna Objeto por ID
		/// </summary>
		public OBJ_TB_NF_ITEM SelecionarObjetoPorId(int id)
		{
			return DAL.SelecionarObjetoPorId(id);
			
		}
				
			
		/// <summary>
		/// Retorna DataSet Parametros Where, OrderBy
		/// </summary>	
		public DataSet Selecionar(String Where, String OrderBy)
        {
            return DAL.Selecionar(Where, OrderBy);
        }
		
		/// <summary>
		/// Retorna DataSet
		/// </summary>	
		public DataSet Selecionar()
        {
            return DAL.Selecionar();
        }
			
		
		/// <summary>
		/// Retorna uma lista de objetos por parametro Where, OrderBy
		/// </summary>
		public List<OBJ_TB_NF_ITEM>SelecionarLista(String Where, String OrderBy)
		{						
			return 	DAL.SelecionarLista(Where,OrderBy);
		}
		
		
		/// <summary>
		/// Retorna uma lista de objetos por parametro 
		/// </summary>
		public List<OBJ_TB_NF_ITEM>SelecionarLista()
		{						
			return 	DAL.SelecionarLista();
		}
		
		public void PreencheControle(System.Web.UI.Control controle, bool selecione)
        {
            if (controle is DropDownList)
            {
                DropDownList ddl = (DropDownList)controle;
                ddl.Items.Clear();
                foreach (OBJ_TB_NF_ITEM obj in DAL.SelecionarLista())
                {
                    ddl.Items.Add(new ListItem(obj.id_nf.ToString(), obj.id.ToString()));
                }
                
                if (selecione)
                {
                    ddl.Items.Insert(0, new ListItem("Selecione", ""));
                    ddl.SelectedIndex = 0;
                }

                ddl.DataBind();
            }


            if (controle is ListBox)
            {
                ListBox lst = (ListBox)controle;
                lst.Items.Clear();
                foreach (OBJ_TB_NF_ITEM obj in DAL.SelecionarLista())
                {
                    lst.Items.Add(new ListItem(obj.id_nf.ToString(), obj.id.ToString()));
                }

                if (selecione)
                {
                    lst.Items.Insert(0, new ListItem("Selecione", ""));
                    lst.SelectedIndex = 0;
                }

                lst.DataBind();
            }

        }										
			
		
		public DataSet ListaCampos()
		{
			 return DAL.ListaCampos();
		}

      
        public bool ExisteItem(int id_nf)
        {

            if (DAL.SelecionarLista(string.Format("tb_nf_item.id_nf = {0}", id_nf), "").Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }


        public bool ExisteItem(int id_nf, int id_produto_servico)
        {

            if (DAL.SelecionarLista(string.Format("tb_nf_item.id_nf = {0} and tb_nf_item.id_produto_servico = {1}", id_nf, id_produto_servico), "").Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }


        public List<int> ListaProdutos(int id_nf)
        {
            // RETORNO TODOS OS ITEM QUE JA EXISTEM NA TABELA ORCAMENTO ITEM
            List<OBJ_TB_NF_ITEM> lista_item = new List<OBJ_TB_NF_ITEM>();

            lista_item = DAL.SelecionarLista(string.Format("tb_nf_item.id_nf = {0}", id_nf), "");

            // INCLUIO NA LISTA TODOS OS CODIGOS DOS PRODUTOS EXISTENTES NA TABELA
            List<int> item = new List<int>();
            for (int i = 0; i < lista_item.Count - 1; i++)
            {
                item.Add(lista_item[i].id_produto_servico);
            }
            return item;
        }


        public DataTable CriarDataTable()
        {
            return DAL.CriarDataTable();
        }


        public DataTable PreencheDataTable(DataTable dt, OBJ_TB_NF_ITEM item)
        {

            return DAL.PreencheDataTable(dt, item);
        }


        public void SerializeLista(List<OBJ_TB_NF_ITEM> obj, string arquivo)
        {

            try
            {
                // C#
                // Create file to save the data to
                FileStream fs = new FileStream(arquivo, FileMode.Create);
                // Create an XmlSerializer object to perform the serialization
                XmlSerializer xs = new XmlSerializer(typeof(List<OBJ_TB_NF_ITEM>));
                // Use the XmlSerializer object to serialize the data to the file
                xs.Serialize(fs, obj);
                // Close the file
                fs.Close();
            }
            catch (Exception)
            {

                throw;
            }



        }


        public List<OBJ_TB_NF_ITEM> DeserializeLista(string arquivo)
        {
            try
            {
                // C#
                // Open file to read the data from
                FileStream fs = new FileStream(arquivo, FileMode.Open);
                // Create an XmlSerializer object to perform the deserialization
                XmlSerializer xs = new XmlSerializer(typeof(List<OBJ_TB_NF_ITEM>));
                // Use the XmlSerializer object to deserialize the data from the file
                List<OBJ_TB_NF_ITEM> obj = (List<OBJ_TB_NF_ITEM>)xs.Deserialize(fs);
                // Close the file
                fs.Close();

                return obj;

            }
            catch (Exception)
            {

                throw;
            }

        }

        public void SerializeObjeto(OBJ_TB_NF_ITEM obj, string arquivo)
        {

            try
            {
                // C#
                // Create file to save the data to
                FileStream fs = new FileStream(arquivo, FileMode.Create);
                // Create an XmlSerializer object to perform the serialization
                XmlSerializer xs = new XmlSerializer(typeof(OBJ_TB_NF_ITEM));
                // Use the XmlSerializer object to serialize the data to the file
                xs.Serialize(fs, obj);
                // Close the file
                fs.Close();
            }
            catch (Exception)
            {

                throw;
            }



        }


        public OBJ_TB_NF_ITEM DeserializeObjeto(string arquivo)
        {
            try
            {
                // C#
                // Open file to read the data from
                FileStream fs = new FileStream(arquivo, FileMode.Open);
                // Create an XmlSerializer object to perform the deserialization
                XmlSerializer xs = new XmlSerializer(typeof(OBJ_TB_NF_ITEM));
                // Use the XmlSerializer object to deserialize the data from the file
                OBJ_TB_NF_ITEM obj = (OBJ_TB_NF_ITEM)xs.Deserialize(fs);
                // Close the file
                fs.Close();

                return obj;

            }
            catch (Exception)
            {

                throw;
            }

        }

        /// <summary>
        /// Soma Valor
        /// </summary>
        /// <param name="tabela"></param>
        /// <returns></returns>
        public Decimal SomaValor(DataTable tabela, string coluna, string param)
        {
            DataTable dt = tabela;

            decimal valor_total = 0;

            try
            {
                if (dt != null)
                {
                    object resultado = dt.Compute(string.Format("SUM({0})", coluna), param);
                    if (resultado != DBNull.Value)
                    {
                        valor_total = Convert.ToDecimal(resultado);
                        return valor_total;
                    }
                    else
                    {
                        return valor_total;
                    }

                }
                else
                {
                    return valor_total;
                }

            }
            catch (Exception)
            {               
                throw;
            }



        }

        public Decimal SomaValor(DataTable tabela, string coluna)
        {
            DataTable dt = tabela;

            decimal valor = 0;

            try
            {
                if (dt != null)
                {
                    object resultado = dt.Compute(string.Format("SUM({0})", coluna), "");

                    if (resultado != DBNull.Value)
                    {
                        valor = Convert.ToDecimal(resultado);
                        return valor;

                    }
                    else
                    {
                        return valor;
                    }


                }
                else
                {
                    return valor;
                }

            }
            catch (Exception)
            {
                throw;
            }



        }


		#endregion
	}
	#endregion
}

